
/**
 * Simple script to convert a Datagrid to a HTML table and then 
 * pass it on to an external excel exporter
 *
 */    

//Libs that are mostly used 
//(only a number are necessary for the datagrid conversion and export)
import flash.errors.*;
import flash.events.*;
import flash.external.*;
import flash.net.URLRequest;
import flash.net.URLVariables;

import mx.collections.ArrayCollection;
import mx.controls.AdvancedDataGrid;
import mx.formatters.DateFormatter;

/**
 * Convert the datagrid to a html table
 * Styling etc. can be done externally
 * 
 * @param: dg Datagrid Contains the datagrid that needs to be converted
 * @returns: String
 */
private function convertDGToHTMLTable(dg:AdvancedDataGrid,provider:ArrayCollection):String {
	//Set default values
	var font:String = dg.getStyle('fontFamily');
	var size:String = dg.getStyle('fontSize');
	var str:String = '';
	var colors:String = '';
	var style:String = 'style="font-family:'+font+';font-size:'+size+'pt;"';				
	var hcolor:Array;
	
	//Retrieve the headercolor
	if(dg.getStyle("headerColor") != undefined) {
		hcolor = [dg.getStyle("headerColor")];
	} else {
		hcolor = dg.getStyle("headerColors");
	}				
	
	//Set the htmltabel based upon knowlegde from the datagrid
	str+= '<table width="'+dg.width+'" border="1"><thead><tr width="'+dg.width+'" style="background-color:#' +Number((hcolor[0])).toString(16)+'">';
	
	//Set the tableheader data (retrieves information from the datagrid header				
	for(var i:int = 0;i<dg.columns.length;i++) { 
		//去掉checkbox列
		if(dg.columns[i].headerText == "" && dg.columns[i].dataField == null){
			continue; 
		}
		colors = dg.getStyle("themeColor");
			
		if(dg.columns[i].headerText != undefined) {
			str+="<th "+style+">"+dg.columns[i].headerText+"</th>";
		} else {
			str+= "<th "+style+">"+dg.columns[i].dataField+"</th>";
		}
	}
	str += "</tr></thead><tbody>";
	colors = dg.getStyle("alternatingRowColors");
	
	//Loop through the records in the dataprovider and 
	//insert the column information into the table
	for(var j:int =0;j<provider.length;j++) {					
		str+="<tr width=\""+Math.ceil(dg.width)+"\">";
			
		for(var k:int=0; k < dg.columns.length; k++) {
			//去掉checkbox列
			if(dg.columns[k].dataField == null){
				continue; 
			}
			//Do we still have a valid item?						
			if(provider.getItemAt(j) != undefined && provider.getItemAt(j) != null) {
				
				//Check to see if the user specified a labelfunction which we must
				//use instead of the dataField
				if(dg.columns[k].labelFunction != undefined) {  //日期转换！
				    var date:DateFormatter = new DateFormatter();
				    date.formatString = "YYYY-MM-DD";
//					str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.columns[k].labelFunction(provider.getItemAt(j),dg.columns[k].dataField)+"</td>";
					str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+date.format(provider.getItemAt(j)[dg.columns[k].dataField])+"</td>";
					
				} else {
					//Our dataprovider contains the real data
					//We need the column information (dataField)
					//to specify which key to use.
					str += "<td width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+provider.getItemAt(j)[dg.columns[k].dataField]+"</td>";
				}
			}
		}
		str += "</tr>";
	}
	str+="</tbody></table>";

	return str;
}

/**
 * Load a specific datagrid into Excel
 * This method passes the htmltable string to an backend script which then
 * offers the excel download to the user.
 * The reason for not using a copy to clipboard and then javascript to
 * insert it into Excel is that this mostly will fail because of the user
 * setup (Webbrowser configuration).
 * 
 * @params: dg Datagrid The Datagrid that will be loaded into Excel
 * @params: url String The location of the excel export file
 */
private function loadDGInExcel(dg:AdvancedDataGrid,url:String,provider:ArrayCollection):void {

	//Pass the htmltable in a variable so that it can be delivered
	//to the backend script
	var variables:URLVariables = new URLVariables(); 
	variables.htmltable	= convertDGToHTMLTable(dg,provider);
	
	//Setup a new request and make sure that we are 
	//sending the data through a post
	var u:URLRequest = new URLRequest(url);
	u.data = variables; //Pass the variables
	u.method = URLRequestMethod.POST; //Don't forget that we need to send as POST
	
	//Navigate to the script
	//We can use _self here, since the script will through a filedownload header
	//which results in offering a download to the user (and still remaining in you Flex app.)
    navigateToURL(u,"_self");
}